home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 July / EnigmA AMIGA RUN 20 (1997)(G.R. Edizioni)(IT)[!][issue 1997-07 & 08][EAR-CD IV].iso / lightwave / arexx_macros / sortlw.rex < prev   
OS/2 REXX Batch file  |  1996-12-09  |  6KB  |  282 lines

  1. /* $VER: SortLWScene.rexx v1.3  ·  20 Jun 1995
  2.  * Sorts objects in a LightWave 3D scene file
  3.  * Considers and maintains parent, aim and morph targets; Does NOT
  4.  * sort names for Bone heirarchy within an object.
  5.  * By: Bryan Ewert
  6.  */
  7.  
  8. /* History:
  9.  *    v1.3  (20 Jun 1995)
  10.  *       - BUG!  Not respecting MorphTargets
  11.  *    v1.2  (09 Feb 1995)
  12.  *       - Purge libs when done
  13.  *    v1.1 - Added CLIPs for memory
  14.  *         - replaced DIRECTORY() with up-to-date engine
  15.  *    v1.0 - Initial release
  16.  */
  17.  
  18. PARSE ARG Scene
  19.  
  20. IF Scene='?' THEN DO
  21.    SAY 'SortLWScene v1.3 (20 Jun 1995)  by Bryan Ewert'
  22.    SAY ''
  23.    SAY 'TEMPLATE: SortLWScene.rexx <LWScene>'
  24.    SAY '<LWScene> is optional -- omitting it will provide a file requester.'
  25.    SAY '  (this will require RexxArpLib.library!)'
  26.    SAY 'Default output file will be <LWScene> with ".sort" extension'
  27.    SAY ''
  28.    EXIT
  29.    END
  30.  
  31. Sorted=Scene || '.sort'
  32.  
  33. IF Scene='' THEN DO
  34.    AddRexxArp = ADDLIB('rexxarplib.library',0,-30,0)
  35.    Scene='JUUL:'
  36.    IF GETCLIP(SLW_Scene)~='' THEN Scene=GETCLIP(SLW_Scene)
  37.    Scene=GetFile(50, 25, DIRECTORY(Scene), FILENAME(Scene), 'Sort which scene?', WorkBench)
  38.    IF Scene='' THEN DO
  39.       CALL PURGELIBS(AddRexxArp)
  40.       EXIT
  41.       END
  42.    CALL SETCLIP(SLW_Scene, Scene)
  43.    Sorted=GetFile(50, 25, DIRECTORY(Scene), FILENAME(Scene) || '.sort', 'Save sorted scene as?', WorkBench, "SAVE")
  44.    IF Sorted='' THEN DO
  45.       CALL PURGELIBS(AddRexxArp)
  46.       EXIT
  47.       END
  48.    END
  49.  
  50. Arp=SHOW('L','rexxarplib.library')
  51.  
  52. CALL PRAGMA('W', 'NULL')
  53.  
  54. IF ~EXISTS(Scene) THEN DO
  55.    SAY 'Sorry... cannot find' Scene
  56.    CALL PURGELIBS(AddRexxArp)
  57.    EXIT 10
  58.    END
  59.  
  60. IF EXISTS(Sorted) THEN DO
  61.    IF Arp THEN DO
  62.       Query=Request(50, 25, '** WARNING! **\\' || Sorted '\already exists\\Overwrite?\',,'Sure', 'NO!', WorkBench)
  63.       IF Query~='OKAY' THEN DO
  64.          CALL PURGELIBS(AddRexxArp)
  65.          EXIT
  66.          END
  67.       END
  68.    ELSE DO
  69.       SAY ''
  70.       SAY '** WARNING! **'
  71.       SAY Sorted 'already exists!'
  72.       SAY 'Overwrite?'
  73.       PULL Overwrite
  74.       IF ABBREV(Overwrite, 'Y')=0 THEN DO
  75.          CALL PURGELIBS(AddRexxArp)
  76.          EXIT
  77.          END
  78.       END
  79.    END
  80.  
  81. CALL PRAGMA('W', 'WorkBench')
  82.  
  83. CALL OPEN(LWScene, Scene, R)
  84.  
  85. IF READLN(LWScene)~='LWSC' THEN DO
  86.    SAY Scene 'is NOT a LightWave scene file.'
  87.    CALL PURGELIBS(AddRexxArp)
  88.    EXIT 10
  89.    END
  90.  
  91. Null=READLN(LWScene)
  92. Null=READLN(LWScene)
  93.  
  94. Objects=0
  95. Data.Objects=''
  96.  
  97. Message='Please wait... reading LWScene...'
  98. IF Arp THEN CALL PostMsg(50, 25, Message, 'WorkBench')
  99. ELSE SAY Message
  100.  
  101. DO FOREVER
  102.  
  103.    Line=READLN(LWScene)
  104.    IF ABBREV(Line, 'AmbientColor') THEN LEAVE
  105.    IF ABBREV(Line, 'LoadObject') | ABBREV(Line, 'AddNullObject') THEN DO
  106.       Objects=Objects+1
  107.       Number.Objects=Objects
  108.       Data.Objects=''
  109.       Parent.Objects=0
  110.       Target.Objects=0
  111.       IF ABBREV(Line, 'LoadObject') THEN Name.Objects=FILENAME(Line)
  112.       ELSE Name.Objects=SUBWORD(Line, 2)
  113.       OldName.Objects=Name.Objects
  114.       END
  115.  
  116.    Data.Objects=Data.Objects || Line || '0a'x
  117.  
  118.    END
  119.  
  120. EndData=Line || '0a'x || READCH(LWScene, 64000)
  121.  
  122. CALL CLOSE(LWScene)
  123.  
  124. Message='Done reading... now parsing...'
  125. IF Arp THEN CALL PostMsg(50, 25, Message, 'WorkBench')
  126. ELSE SAY Message
  127.  
  128. DO I=1 TO Objects-1
  129.    DO J=I+1 TO Objects
  130.       IF Name.I > Name.J THEN DO
  131.          Temp=Data.I ; Data.I=Data.J ; Data.J=Temp
  132.          Temp=Number.I ; Number.I=Number.J ; Number.J=Temp
  133.          Temp=Name.I ; Name.I=Name.J ; Name.J=Temp
  134.          END
  135.       END
  136.    END
  137.  
  138. /* S=Start position of line
  139.  * E=End position of Line (NL)
  140.  * Old=Where the script says the parent is
  141.  * New=Where the parent SHOULD be
  142.  */
  143.  
  144. DO I=1 TO Objects
  145.    S=POS('EndBehavior ', Data.I)
  146.    E=POS('0a'x, Data.I, S)
  147.  
  148.    OnBone=0
  149.  
  150.    DO FOREVER
  151.       Line=NEXTLINE(Data.I)
  152.  
  153.       Command=SUBWORD(Line, 1, 1)
  154.  
  155.       IF Command='ShadowOptions' THEN ITERATE I
  156.       IF Command='AddBone' THEN DO
  157.          OnBone=1    /* So it skips ParentObject for bones. */
  158.          DO UNTIL WORD(NEXTLINE(Data.I), 1)='EndBehavior'
  159.             END
  160.          END
  161.  
  162.       IF (Command='ParentObject' & OnBone=0) | Command='MorphTarget' | Command='TargetObject' THEN DO
  163.          SAY 'Found' Command
  164.          Old=SUBWORD(Line, 2)
  165.          DO K=1 TO Objects
  166.             IF Number.K=Old THEN DO
  167.                New=K
  168.                LEAVE K
  169.                END
  170.             END
  171.  
  172.          Data.I=LEFT(Data.I, S-1) || Command New || SUBSTR(Data.I, E)
  173.  
  174.          E=POS('0a'x, Data.I, E-4)
  175.  
  176.          END
  177.  
  178.       END
  179.  
  180.    END
  181.  
  182. Option.1='ParentObject'
  183. Option.2='TargetObject'
  184. Option.2='MorphTarget'
  185.  
  186. DO I=1 TO 3
  187.    E=1
  188.    DO FOREVER
  189.       S=POS(Option.I, EndData, E)
  190.       IF S=0 THEN ITERATE I
  191.  
  192.       SAY 'Found' Option.I
  193.  
  194.       E=POS('0a'x, EndData, S)
  195.       Line=SUBSTR(EndData, S, E-S)
  196.  
  197.       Old=SUBWORD(Line, 2)
  198.       DO K=1 TO Objects
  199.          IF Number.K=Old THEN DO
  200.             New=K
  201.             LEAVE K
  202.             END
  203.          END
  204.  
  205.       EndData=LEFT(EndData, S-1) || Option.I New || SUBSTR(EndData, E)
  206.       E=POS('0a'x, EndData, E-4)
  207.  
  208.       END
  209.  
  210.    END
  211.  
  212. CALL OPEN(LWSort, Sorted, W)
  213.  
  214. CALL WRITELN(LWSort, 'LWSC')
  215. CALL WRITELN(LWSort, '1')
  216. CALL WRITELN(LWSort, '')
  217.  
  218. DO I=0 TO Objects
  219.    CALL WRITECH(LWSort, Data.I)
  220.    END
  221.  
  222. CALL WRITECH(LWSort, EndData)
  223.  
  224. CALL CLOSE(LWSort)
  225.  
  226. IF Arp THEN CALL PostMsg()
  227. ELSE SAY 'Done!'
  228.  
  229. CALL PURGELIBS(AddRexxArp)
  230.  
  231. EXIT
  232.  
  233. ----------------------------------------------------------------------
  234.  
  235. NEXTLINE:
  236.  
  237.    PARSE ARG Work
  238.  
  239.    S=E+1
  240.    Z=POS('0a'x, Work, S)
  241.    E=Z
  242.  
  243.    Line=SUBSTR(Work, S, E-S)
  244.  
  245.    RETURN Line
  246.  
  247. ----------------------------------------------------------------------
  248.  
  249. DIRECTORY: PROCEDURE
  250.  
  251.    PARSE ARG pathname
  252.  
  253.    Slash=1
  254.    Here=LastPos("/", pathname)
  255.    IF here = 0 THEN DO
  256.       Slash=0
  257.       here = LastPos(':', pathname)
  258.       END
  259.    IF here = 0 THEN
  260.       RETURN ''
  261.    ELSE
  262.       RETURN LEFT(pathname, Here-Slash)
  263.  
  264. FILENAME: PROCEDURE
  265.  
  266.     PARSE ARG pathname
  267.     here = LastPos("/", pathname)
  268.     IF here = 0 THEN
  269.         here = LastPos(":", pathname)
  270.     IF here = 0 THEN
  271.         RETURN pathname
  272.     ELSE
  273.         RETURN(SubStr(pathname, here+1))
  274.  
  275. PURGELIBS: PROCEDURE
  276.  
  277.    PARSE ARG AddRexxArp
  278.  
  279.    IF AddRexxArp THEN CALL REMLIB('rexxarplib.library')
  280.  
  281.    RETURN
  282.